iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

對應 30天挑戰精通 PowerShell 該書第 13 章「遠端控制:一對一及一對多」。

終於到了遠端控制這個章節,終於可以稍微分享自己觸及 DevOps 領域的經驗。

在 CI 階段,當開發人員完成一個階段性的程式碼後,會透過自動化工具進行測試和驗證,幫助偵測程式碼問題,並建置出即將部署的版本(Build)。而在 CD 階段,經過 CI 測試後的建置程式碼,可以透過 CD 工具部署到伺服器上,從而減少人工部署所需的時間。

一般來說,CI 階段會將 Build 產出為 Artifact,然後在 CD 階段透過 Task 將 Artifact 下載到目標伺服器進行部署。然而,我曾經實作過在 CI 階段產出 Build 後,直接使用 PowerShell 將建置好的資料夾複製到需要部署的伺服器。這樣的做法有其優缺點,好處是大大縮短了 CI/CD 的時間;缺點則在於當需要重複使用該 Build 時,必須再執行一次 CI 流程。因此,最終是否採用此方法仍需根據實際需求,來構建符合自己單位的 CI/CD 流程。

PowerShell 的開發者們建立了一個適用於整個 shell 的系統,叫做遠端操作( remoting )。這個系統能讓你在遠端電腦上執行任何 cmdlet。事實上,你甚至可以執行「只存在遠端電腦上、但你自己電腦上沒有」的命令,這表示你不需要在你的工作站上安裝所有管理用的 cmdlet。這個遠端系統非常強大,並且提供了有趣的管理功能。


遠端 PowerShell 的基本概念

遠端操作的核心是在本地電腦和遠端電腦之間建立一個會話,透過這個會話,您可以執行命令、取得輸出,甚至執行僅存在於遠端電腦上的 cmdlet。當你執行一個命令時,透過遠端電腦去執行,並將結果回到本地電腦。

Windows 裝置上的遠端操作

在 Windows 系統中,PowerShell 使用 WinRM(Windows Remote Management)作為遠端操作的基礎。

透過 Get-Service 確認 WinRM 是否開啟

在預設情況下,在 Windows 10 的裝置以及 Windows Server 2012 以上的版本中,都有安裝 WinRM,但預設設定為停用。

PS C:\Windows\system32> Get-Service -Name WinRM

Status   Name               DisplayName
------   ----               -----------
Stopped  WinRM              Windows Remote Management (WS-Manag...

開啟 WinRM Service

此指令會顯示當前的 WinRM 狀態,如果尚未啟用,會提示您是否要啟用並進行必要的配置。

PS C:\Windows\system32> winrm quickconfig

WinRM 是基於 WS-Management Protocol 的實現,允許在 Windows 系統之間進行安全的遠端管理。要在 Windows 裝置上使用遠端 PowerShell,需要確保 WinRM 已啟用並正確配置。此外,還需要設定防火牆規則和授權,以確保連接的安全性。

透過 Get-WSManInstance 確認 WSMan 所監聽的連接

這個指令會顯示所有配置的 WSMan 監聽器,包含協議(HTTP/HTTPS)和監聽的連接埠號(例如 5985 或 5986)。

PS C:\Windows\system32> Get-WSManInstance -ResourceURI winrm/config/listener -Enumerate

cfg                   : http://schemas.microsoft.com/wbem/wsman/1/config/listener
xsi                   : http://www.w3.org/2001/XMLSchema-instance
lang                  : zh-TW
Address               : *
Transport             : HTTP
Port                  : 5985
Hostname              :
Enabled               : true
URLPrefix             : wsman
CertificateThumbprint :
ListeningOn           : {10.1.1.127, 127.0.0.1, ::1, 2001:0:2851:782c:20f9:39e9:f5fb:fffb...}

透過 winrm 命令確認監聽 port

PS C:\Windows\system32> winrm enumerate winrm/config/listener
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 10.1.1.127, 127.0.0.1, ::1, 2001:0:2851:782c:20f9:39e9:f5fb:fffb, fe80::5efe:10.4.0.4%3, fe80::20f9:39e9:f5fb:fffb%2, fe80::518e:db70:8bb0:1c4%5

macOS 和 Linux 裝置上的遠端操作

在 macOS 和 Linux 上,PowerShell Core(現在的 PowerShell 7)支援遠端操作。由於這些系統不支援 WinRM,PowerShell 使用 SSH(Secure Shell)協議進行遠端連接。Microsoft 將 OpenSSH 移植到 Windows,這意味著您可以透過 SSH 在這些系統上建立遠端 PowerShell 會話,而不需要額外的軟體。

OpenSSH 與 PowerShell 之間的關係

SSH 允許多個子系統進行註冊。這讓不同的協定能夠透過「同一個埠號」來運作。當你啟用 SSH 遠端操作時,PowerShell 就註冊為一個子系統,而「從 PSRP 傳入的連線」會被導引到這個子系統。

跨平台遠端操作

跨平台遠端操作允許您從一個作業系統連接到不同作業系統上的 PowerShell,例如從 Windows 連接到 Linux,或從 Linux 連接到 Windows。這種靈活性得益於 PowerShell 對通用協議(如 SSH)的支援,實現了在不同平台之間的一致性遠端管理體驗。

PowerShell 的 cmdlet 都會產生「物件」作為它們的輸出結果。當你執行遠端命令時,其輸出物件需要被轉換成可以方便在網路傳輸的形式。事實證明 XML 就是最好的方式,因此 PowerShell 會自動把輸出物件「序列化」為 XML。這個 XML 會透過網路進行傳輸,並在你的電腦上被「反序列化」為可在 PowerShell 中使用的物件。序列化( serialization)和反序列化( deserialization )本質上是一種格式轉換的過程:從物件轉化為 XML(序列化),再將 XML 轉回物件( 反序列化 )。

例如,當你從 Windows 使用 Invoke-Command 連接到一台 Linux 伺服器時,所執行的命令會在 Linux 上運行,並產生物件輸出。這些物件會立即被 PowerShell 序列化為 XML,並經由 SSH 回傳到 Windows 客戶端,在 Windows 客戶端上再被反序列化為原生 PowerShell 物件。這種處理方式不僅確保了數據的準確性和一致性,還讓系統管理員能夠利用相同的工具集,輕鬆管理異構的 IT 環境。
這一序列化和反序列化技術的應用,真正體現了 PowerShell 在跨平台操作中的強大靈活性,使您能在 Windows 和非 Windows 環境中進行無縫的管理與控制,進而提升整體的管理效率和操作一致性。


心得

發現書中針對 WinRM 的說明十分棒,但是針對一對一及一對多的遠端操作不夠充實,明天打算就該部分深入補充。


明日主題

Day 15 - 解釋 WinRM、PSSession、Invoke-Command


上一篇
Day 13 - 篩選與比較
下一篇
Day 15 - 解釋 WinRM、PSSession、Invoke-Command
系列文
《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言